package gns

import (
	"net/http"

	"gitee.com/liumou_site/gns/eth"
	httpcheck "gitee.com/liumou_site/gns/http"
	"gitee.com/liumou_site/gns/ip"
	"gitee.com/liumou_site/gns/ping"
	"gitee.com/liumou_site/gns/port"
	"gitee.com/liumou_site/gns/tools"
	"gitee.com/liumou_site/gns/traceroute"
)

// NewNet 创建并初始化一个新的网络信息结构体实例。
// 该函数无需参数。
// 返回值是 *NetInfo，表示返回一个指向 NetInfo 结构的指针，该结构包含了网络连接和请求的配置信息。
func NewNet() *NetInfo {
	g := new(NetInfo)
	g.Agreement = "TCP"
	g.Https = false
	g.Port = 80
	g.Timeout = 5
	g.Code = 200
	g.Client = &http.Client{}
	return g
}

// NewPing 创建并初始化一个新的 PingCmd 实例。
// 参数 count 指定ping命令发送的请求数量。
// 参数 timeout 指定ping命令的超时时间（单位为秒）。
// 返回值是初始化后的 PingCmd 实例指针。
func NewPing(count, timeout int) *PingCmd {
	return &PingCmd{
		pingCount: count,
		timeout:   timeout,
	}
}

// NewPortChecker 创建并初始化端口检测器
func NewPortChecker(protocol string, count, timeout int) *port.PortChecker {
	return port.NewPortChecker(protocol, count, timeout)
}

// NewTracerouteParam 创建并初始化路由追踪参数
func NewTracerouteParam(host string, port, maxHop, timeout int) traceroute.TracerouteParam {
	return traceroute.NewTracerouteParam(host, port, maxHop, timeout)
}

// NewHTTPChecker 创建并初始化HTTP检测器
func NewHTTPChecker(url string, timeout int, method string) *httpcheck.HTTPChecker {
	return httpcheck.NewHTTPChecker(url, timeout, method)
}

// GNSManager 主管理结构体，绑定所有子模块功能
// 新增Port、Traceroute、HTTP检测能力
// Port: 端口检测器
// Traceroute: 路由追踪
// HTTP: HTTP检测
type GNSManager struct {
	Ping       *ping.Ping
	Eth        *eth.Eth
	IP         *ip.IPManager
	Tools      *tools.ToolsManager
	Port       *port.PortChecker
	Traceroute traceroute.TracerouteParam
	HTTP       *httpcheck.HTTPChecker
}

// NewGNSManager 创建并初始化一个新的GNSManager实例
func NewGNSManager(debug bool) *GNSManager {
	return &GNSManager{
		Ping:       ping.NewPing(5, 5),
		Eth:        eth.NewEth(debug),
		IP:         ip.NewIPManager(),
		Tools:      tools.NewToolsManager(),
		Port:       nil, // 由用户按需初始化
		Traceroute: traceroute.NewTracerouteParam("127.0.0.1", 0, 30, 3),
		HTTP:       nil, // 由用户按需初始化
	}
}
